package com.juli.school.app.controller.module;

import java.util.UUID;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.juli.school.dao.entity.Login;
import com.juli.school.dao.entity.Stu;
import com.juli.school.service.bo.LoginBo;
import com.juli.school.service.enums.EnumLoginType;
import com.juli.school.service.impl.LoginService;
import com.juli.school.service.impl.StuService;
import com.juli.school.service.utils.Global;
import com.juli.school.utils.core.model.CommonResp;

/**
 * @Description: 登陆控制器
 * @author gaoxiang
 * @date 2017年9月10日 下午9:53:05
 */
@Controller
@RequestMapping("login")
public class LoginController {
	
	@Resource
	LoginService loginService;
	
	@Resource
	StuService stuService;
	
	/**
	 * @Description: 第三方登录
	 * @author gaoxiang
	 * @date 2017年12月27日 下午6:01:20
	 */
	@RequestMapping(value = "/trdPartyLogin")
	@ResponseBody CommonResp<String> trdPartyLogin(String uid) {
		CommonResp<String> commonResp = new CommonResp<String>();
		//1 校验是否存在该第三方唯一ID
		CommonResp<Login> loginResp = loginService.getLoginUserByUid(uid);
		// 如果存在则保存到 全局缓存 30分钟失效
		if(loginResp.isSuccess()) {
			String loginKey = UUID.randomUUID().toString();
			Global.cache.put(loginKey, loginResp.getData());
			commonResp.success();
			commonResp.setCode(666);
			commonResp.setData(loginKey);
			commonResp.setMsg("用户【"+loginResp.getData().getPhone()+"】登录成功");
		} else {
			commonResp.fail("用户【"+uid+"】未注册");
			commonResp.setCode(404);
		}
		return commonResp;
	}
	
	/**
	 * @Description: 判断用户是否存在
	 * @author gaoxiang
	 * @date 2017年12月27日 下午6:56:59
	 */
	@RequestMapping(value = "/isUserExists")
	@ResponseBody CommonResp<String> isUserExists(LoginBo loginBo) {
		CommonResp<String> commonResp = new CommonResp<String>();
		// 判断用户ID是否已存在
		CommonResp<Login> loginResp = loginService.getLoginUserByUid(loginBo.getLoginId());
		// 如果存在则保存到 全局缓存 30分钟失效
		if(loginResp.isSuccess()) {
			commonResp.setCode(666);
			commonResp.setMsg("用户【"+loginBo.getLoginId()+"】已经注册，引导登录");
		} else {
			commonResp.setCode(404);
			commonResp.setMsg("用户【"+loginBo.getLoginId()+"】未注册，引导注册");
		}
		return commonResp;
	}
	
	/**
	 * @Description: 注册
	 * @author gaoxiang
	 * @date 2017年12月27日 下午7:40:21
	 */
	@RequestMapping(value = "/register")
	@ResponseBody CommonResp<String> register(LoginBo loginBo,HttpServletRequest request) {
		CommonResp<String> commonResp = new CommonResp<String>();
		//保存学生信息
		CommonResp<Stu> saveStuResp = stuService.saveStu(loginBo);
		if(saveStuResp.isFailure()) {
			commonResp.setCode(saveStuResp.getCode());
			commonResp.setMsg(saveStuResp.getMsg());
			return commonResp;
		}
		//如果是非自有账户登录，则保存三方登录用户信息
		if(!EnumLoginType.isSelf(loginBo.getLoginType())) {
			loginBo.setStuId(saveStuResp.getData().getStuId());
			loginBo.setIpAddr(request.getRemoteHost());
			CommonResp<String> saveResp = loginService.saveTrdPartyLoginInfo(loginBo);
			if(saveResp.isFailure()) {
				return saveResp;
			}
		}
		// 登录成功
		CommonResp<Login> result = loginService.getLoginUserByUid(loginBo.getLoginId());
		if(result.isFailure()) {
			commonResp.setCode(result.getCode());
			commonResp.setMsg(result.getMsg());
			return commonResp;
		}
		String loginKey = UUID.randomUUID().toString();
		Global.cache.put(loginKey, result.getData());
		commonResp.success();
		commonResp.setData(loginKey);
		commonResp.setMsg("用户【"+loginBo.getPhone()+"】注册成功");
		return commonResp;
	}
	
	/**
	 * @Description: 登录
	 * @author gaoxiang
	 * @date 2017年12月27日 下午6:01:40
	 */
	@RequestMapping(value = "/login")
	@ResponseBody CommonResp<String> login(LoginBo loginBo) {
		CommonResp<String> commonResp = new CommonResp<String>();
		// 校验登录
		CommonResp<Login> loginResp = loginService.checkLogin(loginBo);
		// 校验登录成功
		if(loginResp.isSuccess()) {
			//如果是非自有账户登录，则保存三方登录用户信息
			if(!EnumLoginType.isSelf(loginBo.getLoginType())) {
				CommonResp<String> saveResp = loginService.saveTrdPartyLoginInfo(loginBo);
				if(saveResp.isFailure()) {
					return saveResp;
				}
			}
			// 登录成功
			String loginKey = UUID.randomUUID().toString();
			Global.cache.put(loginKey, loginResp.getData());
			commonResp.success();
			commonResp.setData(loginKey);
			commonResp.setMsg("用户【"+loginResp.getData().getPhone()+"】登录成功");
		} else {
			commonResp.fail("用户【"+loginBo.getPhone()+"】登录校验失败");
		}
		return commonResp;
	}
	
}
